Skip to content

Add specs for #each passing source yields by block arity (Enumerator and Lazy)#1365

Open
sampokuokkanen wants to merge 1 commit into
ruby:masterfrom
sampokuokkanen:enumerable-value-pack
Open

Add specs for #each passing source yields by block arity (Enumerator and Lazy)#1365
sampokuokkanen wants to merge 1 commit into
ruby:masterfrom
sampokuokkanen:enumerable-value-pack

Conversation

@sampokuokkanen
Copy link
Copy Markdown
Contributor

Unlike the Enumerable collection methods, which pack yielded source values via rb_enum_values_pack() (0 args -> nil, 1 arg -> the value, N args -> Array), #each passes them to the block by ordinary block arity (rb_yield_values2() in CRuby): a single-argument block receives the first value, a multi-argument block destructures, and a splat block gathers them.

Pin this explicitly via a shared describe used by both Enumerator#each and Enumerator::Lazy#each, complementing the value_packing specs.

This is so we catch bugs like I had in my implementation of packing in truffleruby/truffleruby#4272.

…and Lazy)

Unlike the Enumerable collection methods, which pack yielded source values via
rb_enum_values_pack() (0 args -> nil, 1 arg -> the value, N args -> Array), #each
passes them to the block by ordinary block arity (rb_yield_values2() in CRuby):
a single-argument block receives the first value, a multi-argument block
destructures, and a splat block gathers them.

Pin this explicitly via a shared describe used by both Enumerator#each and
Enumerator::Lazy#each, complementing the value_packing specs.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant